<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <base target="_blank"/>
    <title>JS函数进阶</title>

    <script>
        //全局变量(全局作用域)，在任何地方都可以访问
        //js中代码块（包括if、while等代码块）都是全局变量
        //js中只有方法中声明的变量是局部变量，但是有隐式全局变量，即不用var声明的变量
        var a = 10;

        function f1() {
            num = 10;
        }

        f1();
        //num没有使用var声明，是一个隐式全局变量
        console.log(num);

        //作用域链：只有函数可以制造函数作用域链即函数嵌套-->函数内指向函数外的链式结构
        function chain() {
            var x = 10;

            function chain1() {
                var x = 11;

                function chain2() {
                    var x = 100;
                    //如果x没在chain2定义会网上找，如果chain1找不到去chain中找，还没找到就去全局变量找，最后都找不到直接保存
                    //使用一个未声明的变量直接报错，如果使用一个声明了但是未赋值的变量结果为undefined
                    console.debug(x);
                }

                chain2();
            }

            chain1();
        }

        chain();

        //预解析:js先解析代码再运行代码
        //解析时先把变量的声明提前，但是不会提升赋值。方法也会提前但是不会提前调用；先提升变量声明 再提升方法，如果变量与函数同名，函数优先
        var a = 10;

        function abc() {
            //先从函数内部找a，找不到再查询全局变量
            alert(a);
            var a = 1;

            //相当于一下代码,所以最终结果为undefined
            //var a;
            //alert(a);
            //a=10;
        }

        // abc();

        /**
         *  var x;
         *  function x() {
                console.debug('xxx');
            }

             //变量方法同名时优先使用方法，所以打印方法体
             console.debug(x);
            x=1;
            console.debug(x);

         */
        console.debug(x);

        function x() {
            console.debug('xxx');
        }

        var x = 1;
        console.debug(x);



    </script>
</head>
<body>


</body>

</html>